library(tidyverse)
library(biomaRt)
library(ggrepel)

library(clusterProfiler)
# Parallel
library(BiocParallel)
register(MulticoreParam(6))

load('../data/microarray_NGS_objects.Rdata')
load('../data/top_tables.Rdata')
sva_counts <- read_tsv('../data/sva_counts.tsv.gz')
Rows: 14318 Columns: 66
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr  (1): Gene
dbl (65): GSM2944692, GSM2944693, GSM2944694, GSM2944695, GSM2944696, GSM2944697, GSM2944698, GSM2944699, GSM2944700, GSM327854, GSM327855, GSM327856, GSM327857, GSM327858, GSM327859...

β„Ή Use `spec()` to retrieve the full column specification for this data.
β„Ή Specify the column types or set `show_col_types = FALSE` to quiet this message.
sample_meta_D <- sample_meta %>% filter(Sample %in% colnames(sva_counts)) %>%
  dplyr::select(Sample:Section, Layout:Fusion) %>%
  mutate(S2 = case_when(Section == 'OF' ~ 'OF', TRUE ~ 'OC')) %>%
  unique()

box_marker <- function(table, genes, section = c('OF','OC')){
  if ('matrix' %in% class(table)){
    table <- table %>%
      as_tibble(rownames = 'Gene')
  }
  table %>% 
    pivot_longer(-Gene, names_to = 'Sample', values_to = 'Expression') %>%
    mutate(Sample = gsub('_.*|.CEL.*','',Sample)) %>%
    left_join(sample_meta_D) %>%
    mutate(S2 = case_when(Section == 'OF' ~ 'OF',TRUE ~ 'OC')) %>%
    filter(Gene %in% genes, S2 %in% section) %>%
    #filter(Gene %in% row.names(top.table_OF_AD %>% head(10))) %>%
    mutate(Fusion = factor(Fusion, levels = c('Before','During','After'))) %>%
    mutate(OrgTech = paste(Organism, Technology, sep = '_')) %>% 
    ggplot(aes(x=Fusion, y=Expression, color = Organism, shape = Technology)) +
    # geom_boxplot(aes(group = Fusion), color = 'Black', outlier.colour = NA) +
    # geom_boxplot(aes(group = interaction(Organism,Fusion)), outlier.colour = NA) +
    ggbeeswarm::geom_quasirandom(size = 3, alpha = 0.7) +
    cowplot::theme_cowplot() +
    facet_grid(~Gene + S2, scales = 'free_y') +
    ggsci::scale_color_aaas() +
    ylab('log2 (corrected counts)') +
    stat_summary(fun=mean, geom = 'line', aes(group = OrgTech, color = Organism))
}

volcano_maker <- function(df, 
                          title="Volcano Plot", 
                          pvalue='P.Value', 
                          padj='adj.P.Val', 
                          logFC='logFC', 
                          gene_list = ''){
  df$pvalue <- df[,pvalue]
  df$log2FoldChange <- df[,logFC]
  df$padj <- df[,padj]
  df$Gene <- row.names(df)
  df <- df[!is.na(df$pvalue),]
  print(dim(df))
  
  df <- df %>% mutate(Class = case_when(padj < 0.05 & abs(logFC) > 1~ "FDR < 0.05 & logFC > 1",
                                        padj < 0.1 & abs(logFC) > 1 ~ 'FDR < 0.1 & logFC > 1',
                                        TRUE ~ 'Not significant'))
  df$GeneT <- df$Gene
  if (gene_list == ''){
    gene_list <- df %>% filter(padj < 0.05) %>% pull(Gene) %>% head(10)
  }
  df$Gene[!df$Gene %in% gene_list] <- ''
  
  plot <- ggplot(data=df,aes(label=Gene, x = log2FoldChange, y = -log10(pvalue))) +
    geom_point(aes(colour=Class)) +
    scale_colour_manual(values=c("darkred", "red", "grey")) +
    cowplot::theme_cowplot() +
    geom_vline(aes(xintercept=-1),linetype="dotted") +
    geom_vline(aes(xintercept=1),linetype="dotted") +
    geom_vline(aes(xintercept=-2),linetype="dotted") +
    geom_vline(aes(xintercept=2),linetype="dotted") +
    geom_label_repel(max.overlaps = 100) +
    xlab('logFC') + ylab('-log10(p value)') +
    ggtitle(title) + cowplot::theme_cowplot()
  
  plot
}

During vs Before (OF)

2021-12-06

Negative means that expression is dropping from as the fissure goes from β€œbefore” to β€œduring.” This test is designed to identify which genes are changing across time in the optic fissure region.

Volcano

volcano_maker(top.table_OF_DB, title = 'Optic Fissure - Before/During',
              
              gene_list = c(top.table_OF_DB %>% filter(logFC > 0) %>% head(5) %>% row.names(),
                            top.table_OF_DB %>% filter(logFC < 0) %>% head(5) %>% row.names()))
[1] 14318    10
Warning in if (gene_list == "") { :
  the condition has length > 1 and only the first element will be used

Diff Table

All genes with an FDR < 0.2. Not very many. There are a limited number of samples before the fusion begins (only ZEBRAFISH in fact!) compared to the other time points.

top.table_OF_DB %>% as_tibble(rownames = 'Gene') %>% filter(adj.P.Val < 0.1) %>%  DT::datatable()

Expression of top 6 genes (FDR) across section and stage

Colored by organism. Each line is drawn for organism / technology (remember, mouse has both microarray and RNA-seq).

box_marker(sva_counts, 
           genes = top.table_OF_DB %>% 
             as_tibble(rownames = 'Gene') %>% 
             filter(adj.P.Val < 0.05) %>% head(6) %>% pull(Gene),
           section = 'OF')
Joining, by = "Sample"

box_marker(sva_counts, 
           genes = top.table_OF_DB %>% 
             as_tibble(rownames = 'Gene') %>% 
             filter(adj.P.Val < 0.05) %>% head(6) %>% pull(Gene),
           section = 'OC')
Joining, by = "Sample"

Enrichment Analysis (GO, GSEA) Before -> During

GSEA

GSEA uses a ranked list of genes by logFC. So the p values are not used in this situation. The order is. So the GSEA is useful in situations where there are very few differentially expressed genes. We see here the suppressed (negative expressed genes) terms are relating to mitosis / cell division. The activated gene terms are relating to melanocytes/pigment and ion channels.

Dotplot

dotplot(gseF, showCategory=15, split=".sign") + facet_grid(.~.sign) + cowplot::theme_cowplot()
wrong orderBy parameter; set to default `orderBy = "x"`

Table

So you can see the genes in the ontology term. The genes get β€œincluded” as enriched if GSEA deems them to be ranked unusually high.

gse@result %>% as_tibble() %>% arrange(-abs(NES)) %>% filter(p.adjust < 0.05) %>%  DT::datatable()

GO Enrichment

GO enrichment uses a cutoff between differentially expressed genes (FDR < 0.1 in this case) and everything else.

library(clusterProfiler)
library(enrichplot)


diff_genes <- top.table_OF_DB %>% as_tibble(rownames = 'Gene') %>% filter(adj.P.Val < 0.1)
eg_diff_genes <- bitr(diff_genes$Gene, fromType="SYMBOL", toType="ENTREZID", OrgDb="org.Hs.eg.db")
'select()' returned 1:1 mapping between keys and columns
eg_diff_genes <- diff_genes %>% left_join(., eg_diff_genes, by = c('Gene' = 'SYMBOL'))
eg_universe = bitr(top.table_OF_DB %>% as_tibble(rownames = 'Gene') %>% pull(Gene), fromType="SYMBOL", toType="ENTREZID", OrgDb="org.Hs.eg.db")
'select()' returned 1:many mapping between keys and columns
Warning in bitr(top.table_OF_DB %>% as_tibble(rownames = "Gene") %>% pull(Gene),  :
  0.01% of input gene IDs are fail to map...
egoOF_DB <- enrichGO(gene          = eg_diff_genes$ENTREZID,
                     universe      = eg_universe$ENTREZID,
                     OrgDb         = org.Hs.eg.db,
                     ont           = "all",
                     readable      = TRUE)



p1 <- dotplot(egoOF_DB, showCategory=20) + ggtitle("Dotplot for GO, OF")
wrong orderBy parameter; set to default `orderBy = "x"`
p1

NA
NA

Table

So you can see the genes in the ontology term.

egoOF_DB@result %>% as_tibble() %>%  filter(p.adjust < 0.05) %>%  DT::datatable()

β€œCNET” Plot

Relationships between related GO terms with shared genes

geneList <- eg_diff_genes$logFC
names(geneList) <- eg_diff_genes$Gene
cnet <- cnetplot(egoOF_DB, foldChange = geneList, showCategory = 12) + scale_color_viridis_c(name = 'log2(FoldChange)')
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.
cnet

Wikipathways

# system("wget https://wikipathways-data.wmcloud.org/current/gmt/wikipathways-20211110-gmt-Homo_sapiens.gmt")
wp2gene <- read.gmt('wikipathways-20211110-gmt-Homo_sapiens.gmt')
wp2gene <- wp2gene %>% tidyr::separate(term, c("name","version","wpid","org"), "%")
wpid2gene <- wp2gene %>% dplyr::select(wpid, gene) #TERM2GENE
wpid2name <- wp2gene %>% dplyr::select(wpid, name) #TERM2NAME

ewp <- enricher(eg_diff_genes$ENTREZID,
                TERM2GENE = wpid2gene,
                TERM2NAME = wpid2name,
                pvalueCutoff = 0.1)

ewp_plot <- dotplot(ewp, showCategory=30) + ggtitle("Dotplot for WikiPathways")
wrong orderBy parameter; set to default `orderBy = "x"`
ewp_plot

Table

KEGG Pathway Enrichment

kk <- enrichKEGG(gene         = eg_diff_genes$ENTREZID, 
                 universe = eg_universe$ENTREZID,
                 organism     = 'hsa')
dotplot(kk) + ggtitle("KEGG Pathway Enrichment") 
wrong orderBy parameter; set to default `orderBy = "x"`

Table

My takeaway(s)

  1. The differential testing seems to work as the overall enriched GSEA found terms relate to processes that are involved in cell cycle, adhesion, and the visual cycle.
  2. FGF18 and LUM are interesting (and go in opposite directions)
  3. FGF18 is a growth factor and has a recombinant drug (https://www.nature.com/articles/s41598-020-63216-z)
  4. LUM is interesting it is a lens associated extracellular matrix protein….is lens differentiation going on?

Session Info

devtools::session_info()
─ Session info  πŸ›ŒπŸΎ  πŸ‡ΉπŸ‡΄  πŸ•‹   ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 hash: person in bed: medium-dark skin tone, flag: Tonga, kaaba

 setting  value
 version  R version 4.0.5 (2021-03-31)
 os       macOS Catalina 10.15.7
 system   x86_64, darwin17.0
 ui       RStudio
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/New_York
 date     2021-12-06
 rstudio  2021.09.0+351 Ghost Orchid (desktop)
 pandoc   2.14.0.3 @ /Applications/RStudio.app/Contents/MacOS/pandoc/ (via rmarkdown)

─ Packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 package              * version  date (UTC) lib source
 annotate               1.68.0   2020-10-27 [1] Bioconductor
 AnnotationDbi        * 1.52.0   2020-10-27 [1] Bioconductor
 askpass                1.1      2019-01-13 [1] CRAN (R 4.0.2)
 assertthat             0.2.1    2019-03-21 [1] CRAN (R 4.0.2)
 backports              1.3.0    2021-10-27 [1] CRAN (R 4.0.2)
 beeswarm               0.4.0    2021-06-01 [1] CRAN (R 4.0.2)
 Biobase              * 2.50.0   2020-10-27 [1] Bioconductor
 BiocFileCache          1.14.0   2020-10-27 [1] Bioconductor
 BiocGenerics         * 0.36.1   2021-04-16 [1] Bioconductor
 BiocManager            1.30.16  2021-06-15 [1] CRAN (R 4.0.2)
 BiocParallel         * 1.24.1   2020-11-06 [1] Bioconductor
 biomaRt              * 2.46.3   2021-02-11 [1] Bioconductor
 bit                    4.0.4    2020-08-04 [1] CRAN (R 4.0.2)
 bit64                  4.0.5    2020-08-30 [1] CRAN (R 4.0.2)
 bitops                 1.0-7    2021-04-24 [1] CRAN (R 4.0.2)
 blob                   1.2.2    2021-07-23 [1] CRAN (R 4.0.2)
 broom                  0.7.10   2021-10-31 [1] CRAN (R 4.0.2)
 bslib                  0.3.1    2021-10-06 [1] CRAN (R 4.0.2)
 cachem                 1.0.6    2021-08-19 [1] CRAN (R 4.0.2)
 callr                  3.7.0    2021-04-20 [1] CRAN (R 4.0.2)
 cellranger             1.1.0    2016-07-27 [1] CRAN (R 4.0.2)
 cli                    3.1.0    2021-10-27 [1] CRAN (R 4.0.2)
 clusterProfiler      * 3.18.1   2021-02-11 [1] Bioconductor
 colorspace             2.0-2    2021-06-24 [1] CRAN (R 4.0.2)
 cowplot                1.1.1    2020-12-30 [1] CRAN (R 4.0.2)
 crayon                 1.4.2    2021-10-29 [1] CRAN (R 4.0.2)
 crosstalk              1.1.1    2021-01-12 [1] CRAN (R 4.0.2)
 curl                   4.3.2    2021-06-23 [1] CRAN (R 4.0.2)
 data.table             1.14.2   2021-09-27 [1] CRAN (R 4.0.2)
 DBI                    1.1.1    2021-01-15 [1] CRAN (R 4.0.2)
 dbplyr                 2.1.1    2021-04-06 [1] CRAN (R 4.0.2)
 DelayedArray           0.16.3   2021-03-24 [1] Bioconductor
 desc                   1.4.0    2021-09-28 [1] CRAN (R 4.0.2)
 devtools               2.4.2    2021-06-07 [1] CRAN (R 4.0.2)
 digest                 0.6.28   2021-09-23 [1] CRAN (R 4.0.2)
 DO.db                  2.9      2020-11-19 [1] Bioconductor
 DOSE                   3.16.0   2020-10-27 [1] Bioconductor
 downloader             0.4      2015-07-09 [1] CRAN (R 4.0.2)
 dplyr                * 1.0.7    2021-06-18 [1] CRAN (R 4.0.2)
 DT                     0.19     2021-09-02 [1] CRAN (R 4.0.2)
 edgeR                  3.32.1   2021-01-14 [1] Bioconductor
 ellipsis               0.3.2    2021-04-29 [1] CRAN (R 4.0.2)
 enrichplot           * 1.10.2   2021-01-28 [1] Bioconductor
 evaluate               0.14     2019-05-28 [1] CRAN (R 4.0.1)
 fansi                  0.5.0    2021-05-25 [1] CRAN (R 4.0.2)
 farver                 2.1.0    2021-02-28 [1] CRAN (R 4.0.2)
 fastmap                1.1.0    2021-01-25 [1] CRAN (R 4.0.2)
 fastmatch              1.1-3    2021-07-23 [1] CRAN (R 4.0.2)
 fgsea                  1.16.0   2020-10-27 [1] Bioconductor
 forcats              * 0.5.1    2021-01-27 [1] CRAN (R 4.0.2)
 fs                     1.5.0    2020-07-31 [1] CRAN (R 4.0.2)
 genefilter             1.72.1   2021-01-21 [1] Bioconductor
 generics               0.1.1    2021-10-25 [1] CRAN (R 4.0.2)
 GenomeInfoDb           1.26.7   2021-04-08 [1] Bioconductor
 GenomeInfoDbData       1.2.4    2020-10-07 [1] Bioconductor
 GenomicRanges          1.42.0   2020-10-27 [1] Bioconductor
 ggbeeswarm             0.6.0    2017-08-07 [1] CRAN (R 4.0.2)
 ggforce                0.3.3    2021-03-05 [1] CRAN (R 4.0.2)
 ggfun                  0.0.4    2021-09-17 [1] CRAN (R 4.0.2)
 ggnewscale             0.4.5    2021-01-11 [1] CRAN (R 4.0.2)
 ggplot2              * 3.3.5    2021-06-25 [1] CRAN (R 4.0.2)
 ggraph                 2.0.5    2021-02-23 [1] CRAN (R 4.0.2)
 ggrepel              * 0.9.1    2021-01-15 [1] CRAN (R 4.0.2)
 ggsci                  2.9      2018-05-14 [1] CRAN (R 4.0.2)
 glue                   1.4.2    2020-08-27 [1] CRAN (R 4.0.2)
 GO.db                  3.12.1   2020-11-19 [1] Bioconductor
 GOSemSim               2.16.1   2020-10-29 [1] Bioconductor
 graphlayouts           0.7.1    2020-10-26 [1] CRAN (R 4.0.2)
 gridExtra              2.3      2017-09-09 [1] CRAN (R 4.0.2)
 gtable                 0.3.0    2019-03-25 [1] CRAN (R 4.0.2)
 haven                  2.4.3    2021-08-04 [1] CRAN (R 4.0.2)
 hms                    1.1.1    2021-09-26 [1] CRAN (R 4.0.2)
 htmltools              0.5.2    2021-08-25 [1] CRAN (R 4.0.2)
 htmlwidgets            1.5.4    2021-09-08 [1] CRAN (R 4.0.2)
 httr                   1.4.2    2020-07-20 [1] CRAN (R 4.0.2)
 igraph                 1.2.7    2021-10-15 [1] CRAN (R 4.0.2)
 IRanges              * 2.24.1   2020-12-12 [1] Bioconductor
 jquerylib              0.1.4    2021-04-26 [1] CRAN (R 4.0.2)
 jsonlite               1.7.2    2020-12-09 [1] CRAN (R 4.0.2)
 knitr                  1.36     2021-09-29 [1] CRAN (R 4.0.2)
 labeling               0.4.2    2020-10-20 [1] CRAN (R 4.0.2)
 lattice                0.20-45  2021-09-22 [1] CRAN (R 4.0.2)
 lifecycle              1.0.1    2021-09-24 [1] CRAN (R 4.0.2)
 limma                  3.46.0   2020-10-27 [1] Bioconductor
 locfit                 1.5-9.4  2020-03-25 [1] CRAN (R 4.0.2)
 lubridate              1.8.0    2021-10-07 [1] CRAN (R 4.0.2)
 magrittr               2.0.1    2020-11-17 [1] CRAN (R 4.0.2)
 MASS                   7.3-54   2021-05-03 [1] CRAN (R 4.0.2)
 Matrix                 1.3-4    2021-06-01 [1] CRAN (R 4.0.2)
 MatrixGenerics         1.2.1    2021-01-30 [1] Bioconductor
 matrixStats            0.61.0   2021-09-17 [1] CRAN (R 4.0.2)
 memoise                2.0.0    2021-01-26 [1] CRAN (R 4.0.2)
 mgcv                   1.8-38   2021-10-06 [1] CRAN (R 4.0.2)
 modelr                 0.1.8    2020-05-19 [1] CRAN (R 4.0.2)
 munsell                0.5.0    2018-06-12 [1] CRAN (R 4.0.2)
 nlme                   3.1-153  2021-09-07 [1] CRAN (R 4.0.2)
 openssl                1.4.5    2021-09-02 [1] CRAN (R 4.0.2)
 org.Hs.eg.db         * 3.12.0   2020-11-19 [1] Bioconductor
 pillar                 1.6.4    2021-10-18 [1] CRAN (R 4.0.2)
 pkgbuild               1.2.0    2020-12-15 [1] CRAN (R 4.0.2)
 pkgconfig              2.0.3    2019-09-22 [1] CRAN (R 4.0.2)
 pkgload                1.2.3    2021-10-13 [1] CRAN (R 4.0.2)
 plyr                   1.8.6    2020-03-03 [1] CRAN (R 4.0.2)
 polyclip               1.10-0   2019-03-14 [1] CRAN (R 4.0.2)
 preprocessCore         1.52.1   2021-01-08 [1] Bioconductor
 prettyunits            1.1.1    2020-01-24 [1] CRAN (R 4.0.2)
 processx               3.5.2    2021-04-30 [1] CRAN (R 4.0.2)
 progress               1.2.2    2019-05-16 [1] CRAN (R 4.0.2)
 ps                     1.6.0    2021-02-28 [1] CRAN (R 4.0.2)
 purrr                * 0.3.4    2020-04-17 [1] CRAN (R 4.0.2)
 qsmooth              * 1.6.0    2020-10-27 [1] Bioconductor
 qvalue                 2.22.0   2020-10-27 [1] Bioconductor
 R6                     2.5.1    2021-08-19 [1] CRAN (R 4.0.2)
 rappdirs               0.3.3    2021-01-31 [1] CRAN (R 4.0.2)
 RColorBrewer           1.1-2    2014-12-07 [1] CRAN (R 4.0.2)
 Rcpp                   1.0.7    2021-07-07 [1] CRAN (R 4.0.2)
 RCurl                  1.98-1.5 2021-09-17 [1] CRAN (R 4.0.2)
 readr                * 2.0.2    2021-09-27 [1] CRAN (R 4.0.2)
 readxl                 1.3.1    2019-03-13 [1] CRAN (R 4.0.2)
 remotes                2.4.1    2021-09-29 [1] CRAN (R 4.0.2)
 reprex                 2.0.1    2021-08-05 [1] CRAN (R 4.0.2)
 reshape2               1.4.4    2020-04-09 [1] CRAN (R 4.0.2)
 rlang                  0.4.12   2021-10-18 [1] CRAN (R 4.0.2)
 rmarkdown              2.11     2021-09-14 [1] CRAN (R 4.0.5)
 rprojroot              2.0.2    2020-11-15 [1] CRAN (R 4.0.2)
 RSQLite                2.2.8    2021-08-21 [1] CRAN (R 4.0.2)
 rstudioapi             0.13     2020-11-12 [1] CRAN (R 4.0.2)
 rvcheck                0.2.1    2021-10-22 [1] CRAN (R 4.0.2)
 rvest                  1.0.2    2021-10-16 [1] CRAN (R 4.0.2)
 S4Vectors            * 0.28.1   2020-12-09 [1] Bioconductor
 sass                   0.4.0    2021-05-12 [1] CRAN (R 4.0.2)
 scales                 1.1.1    2020-05-11 [1] CRAN (R 4.0.2)
 scatterpie             0.1.7    2021-08-20 [1] CRAN (R 4.0.2)
 sessioninfo            1.2.1    2021-11-02 [1] CRAN (R 4.0.5)
 shadowtext             0.0.9    2021-09-19 [1] CRAN (R 4.0.2)
 stringi                1.7.5    2021-10-04 [1] CRAN (R 4.0.2)
 stringr              * 1.4.0    2019-02-10 [1] CRAN (R 4.0.2)
 SummarizedExperiment   1.20.0   2020-10-27 [1] Bioconductor
 survival               3.2-13   2021-08-24 [1] CRAN (R 4.0.2)
 sva                    3.38.0   2020-10-27 [1] Bioconductor
 testthat               3.1.0    2021-10-04 [1] CRAN (R 4.0.2)
 tibble               * 3.1.5    2021-09-30 [1] CRAN (R 4.0.2)
 tidygraph              1.2.0    2020-05-12 [1] CRAN (R 4.0.2)
 tidyr                * 1.1.4    2021-09-27 [1] CRAN (R 4.0.2)
 tidyselect             1.1.1    2021-04-30 [1] CRAN (R 4.0.2)
 tidyverse            * 1.3.1    2021-04-15 [1] CRAN (R 4.0.2)
 tweenr                 1.0.2    2021-03-23 [1] CRAN (R 4.0.2)
 tzdb                   0.2.0    2021-10-27 [1] CRAN (R 4.0.2)
 usethis                2.1.3    2021-10-27 [1] CRAN (R 4.0.2)
 utf8                   1.2.2    2021-07-24 [1] CRAN (R 4.0.2)
 vctrs                  0.3.8    2021-04-29 [1] CRAN (R 4.0.2)
 vipor                  0.4.5    2017-03-22 [1] CRAN (R 4.0.2)
 viridis                0.6.2    2021-10-13 [1] CRAN (R 4.0.2)
 viridisLite            0.4.0    2021-04-13 [1] CRAN (R 4.0.2)
 vroom                  1.5.5    2021-09-14 [1] CRAN (R 4.0.2)
 withr                  2.4.2    2021-04-18 [1] CRAN (R 4.0.2)
 xfun                   0.27     2021-10-18 [1] CRAN (R 4.0.2)
 XML                    3.99-0.8 2021-09-17 [1] CRAN (R 4.0.2)
 xml2                   1.3.2    2020-04-23 [1] CRAN (R 4.0.2)
 xtable                 1.8-4    2019-04-21 [1] CRAN (R 4.0.2)
 XVector                0.30.0   2020-10-28 [1] Bioconductor
 yaml                   2.2.1    2020-02-01 [1] CRAN (R 4.0.2)
 yulab.utils            0.0.4    2021-10-09 [1] CRAN (R 4.0.2)
 zlibbioc               1.36.0   2020-10-28 [1] Bioconductor

 [1] /Library/Frameworks/R.framework/Versions/4.0/Resources/library

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
LS0tCnRpdGxlOiAiT0Y6IEJlZm9yZSAtIER1cmluZyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogaGlkZQotLS0KCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoYmlvbWFSdCkKbGlicmFyeShnZ3JlcGVsKQoKbGlicmFyeShjbHVzdGVyUHJvZmlsZXIpCiMgUGFyYWxsZWwKbGlicmFyeShCaW9jUGFyYWxsZWwpCnJlZ2lzdGVyKE11bHRpY29yZVBhcmFtKDYpKQoKbG9hZCgnLi4vZGF0YS9taWNyb2FycmF5X05HU19vYmplY3RzLlJkYXRhJykKbG9hZCgnLi4vZGF0YS90b3BfdGFibGVzLlJkYXRhJykKc3ZhX2NvdW50cyA8LSByZWFkX3RzdignLi4vZGF0YS9zdmFfY291bnRzLnRzdi5neicpCgpzYW1wbGVfbWV0YV9EIDwtIHNhbXBsZV9tZXRhICU+JSBmaWx0ZXIoU2FtcGxlICVpbiUgY29sbmFtZXMoc3ZhX2NvdW50cykpICU+JQogIGRwbHlyOjpzZWxlY3QoU2FtcGxlOlNlY3Rpb24sIExheW91dDpGdXNpb24pICU+JQogIG11dGF0ZShTMiA9IGNhc2Vfd2hlbihTZWN0aW9uID09ICdPRicgfiAnT0YnLCBUUlVFIH4gJ09DJykpICU+JQogIHVuaXF1ZSgpCgpib3hfbWFya2VyIDwtIGZ1bmN0aW9uKHRhYmxlLCBnZW5lcywgc2VjdGlvbiA9IGMoJ09GJywnT0MnKSl7CiAgaWYgKCdtYXRyaXgnICVpbiUgY2xhc3ModGFibGUpKXsKICAgIHRhYmxlIDwtIHRhYmxlICU+JQogICAgICBhc190aWJibGUocm93bmFtZXMgPSAnR2VuZScpCiAgfQogIHRhYmxlICU+JSAKICAgIHBpdm90X2xvbmdlcigtR2VuZSwgbmFtZXNfdG8gPSAnU2FtcGxlJywgdmFsdWVzX3RvID0gJ0V4cHJlc3Npb24nKSAlPiUKICAgIG11dGF0ZShTYW1wbGUgPSBnc3ViKCdfLip8LkNFTC4qJywnJyxTYW1wbGUpKSAlPiUKICAgIGxlZnRfam9pbihzYW1wbGVfbWV0YV9EKSAlPiUKICAgIG11dGF0ZShTMiA9IGNhc2Vfd2hlbihTZWN0aW9uID09ICdPRicgfiAnT0YnLFRSVUUgfiAnT0MnKSkgJT4lCiAgICBmaWx0ZXIoR2VuZSAlaW4lIGdlbmVzLCBTMiAlaW4lIHNlY3Rpb24pICU+JQogICAgI2ZpbHRlcihHZW5lICVpbiUgcm93Lm5hbWVzKHRvcC50YWJsZV9PRl9BRCAlPiUgaGVhZCgxMCkpKSAlPiUKICAgIG11dGF0ZShGdXNpb24gPSBmYWN0b3IoRnVzaW9uLCBsZXZlbHMgPSBjKCdCZWZvcmUnLCdEdXJpbmcnLCdBZnRlcicpKSkgJT4lCiAgICBtdXRhdGUoT3JnVGVjaCA9IHBhc3RlKE9yZ2FuaXNtLCBUZWNobm9sb2d5LCBzZXAgPSAnXycpKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9RnVzaW9uLCB5PUV4cHJlc3Npb24sIGNvbG9yID0gT3JnYW5pc20sIHNoYXBlID0gVGVjaG5vbG9neSkpICsKICAgICMgZ2VvbV9ib3hwbG90KGFlcyhncm91cCA9IEZ1c2lvbiksIGNvbG9yID0gJ0JsYWNrJywgb3V0bGllci5jb2xvdXIgPSBOQSkgKwogICAgIyBnZW9tX2JveHBsb3QoYWVzKGdyb3VwID0gaW50ZXJhY3Rpb24oT3JnYW5pc20sRnVzaW9uKSksIG91dGxpZXIuY29sb3VyID0gTkEpICsKICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oc2l6ZSA9IDMsIGFscGhhID0gMC43KSArCiAgICBjb3dwbG90Ojp0aGVtZV9jb3dwbG90KCkgKwogICAgZmFjZXRfZ3JpZCh+R2VuZSArIFMyLCBzY2FsZXMgPSAnZnJlZV95JykgKwogICAgZ2dzY2k6OnNjYWxlX2NvbG9yX2FhYXMoKSArCiAgICB5bGFiKCdsb2cyIChjb3JyZWN0ZWQgY291bnRzKScpICsKICAgIHN0YXRfc3VtbWFyeShmdW49bWVhbiwgZ2VvbSA9ICdsaW5lJywgYWVzKGdyb3VwID0gT3JnVGVjaCwgY29sb3IgPSBPcmdhbmlzbSkpCn0KCnZvbGNhbm9fbWFrZXIgPC0gZnVuY3Rpb24oZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJWb2xjYW5vIFBsb3QiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBwdmFsdWU9J1AuVmFsdWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqPSdhZGouUC5WYWwnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dGQz0nbG9nRkMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2xpc3QgPSAnJyl7CiAgZGYkcHZhbHVlIDwtIGRmWyxwdmFsdWVdCiAgZGYkbG9nMkZvbGRDaGFuZ2UgPC0gZGZbLGxvZ0ZDXQogIGRmJHBhZGogPC0gZGZbLHBhZGpdCiAgZGYkR2VuZSA8LSByb3cubmFtZXMoZGYpCiAgZGYgPC0gZGZbIWlzLm5hKGRmJHB2YWx1ZSksXQogIHByaW50KGRpbShkZikpCiAgCiAgZGYgPC0gZGYgJT4lIG11dGF0ZShDbGFzcyA9IGNhc2Vfd2hlbihwYWRqIDwgMC4wNSAmIGFicyhsb2dGQykgPiAxfiAiRkRSIDwgMC4wNSAmIGxvZ0ZDID4gMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRqIDwgMC4xICYgYWJzKGxvZ0ZDKSA+IDEgfiAnRkRSIDwgMC4xICYgbG9nRkMgPiAxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAnTm90IHNpZ25pZmljYW50JykpCiAgZGYkR2VuZVQgPC0gZGYkR2VuZQogIGlmIChnZW5lX2xpc3QgPT0gJycpewogICAgZ2VuZV9saXN0IDwtIGRmICU+JSBmaWx0ZXIocGFkaiA8IDAuMDUpICU+JSBwdWxsKEdlbmUpICU+JSBoZWFkKDEwKQogIH0KICBkZiRHZW5lWyFkZiRHZW5lICVpbiUgZ2VuZV9saXN0XSA8LSAnJwogIAogIHBsb3QgPC0gZ2dwbG90KGRhdGE9ZGYsYWVzKGxhYmVsPUdlbmUsIHggPSBsb2cyRm9sZENoYW5nZSwgeSA9IC1sb2cxMChwdmFsdWUpKSkgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3VyPUNsYXNzKSkgKwogICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiZGFya3JlZCIsICJyZWQiLCAiZ3JleSIpKSArCiAgICBjb3dwbG90Ojp0aGVtZV9jb3dwbG90KCkgKwogICAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD0tMSksbGluZXR5cGU9ImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9MSksbGluZXR5cGU9ImRvdHRlZCIpICsKICAgIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9LTIpLGxpbmV0eXBlPSJkb3R0ZWQiKSArCiAgICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PTIpLGxpbmV0eXBlPSJkb3R0ZWQiKSArCiAgICBnZW9tX2xhYmVsX3JlcGVsKG1heC5vdmVybGFwcyA9IDEwMCkgKwogICAgeGxhYignbG9nRkMnKSArIHlsYWIoJy1sb2cxMChwIHZhbHVlKScpICsKICAgIGdndGl0bGUodGl0bGUpICsgY293cGxvdDo6dGhlbWVfY293cGxvdCgpCiAgCiAgcGxvdAp9CmBgYAoKIyBEdXJpbmcgdnMgQmVmb3JlIChPRikKCjIwMjEtMTItMDYKCk5lZ2F0aXZlIG1lYW5zIHRoYXQgZXhwcmVzc2lvbiBpcyBkcm9wcGluZyBmcm9tIGFzIHRoZSBmaXNzdXJlIGdvZXMgZnJvbSAiYmVmb3JlIiB0byAiZHVyaW5nLiIgVGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIGlkZW50aWZ5IHdoaWNoIGdlbmVzIGFyZSBjaGFuZ2luZyAqYWNyb3NzIHRpbWUgaW4gdGhlIG9wdGljIGZpc3N1cmUgcmVnaW9uLioKCiMjIFZvbGNhbm8KCmBgYHtyLCBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD0zfQp2b2xjYW5vX21ha2VyKHRvcC50YWJsZV9PRl9EQiwgdGl0bGUgPSAnT3B0aWMgRmlzc3VyZSAtIEJlZm9yZS9EdXJpbmcnLAogICAgICAgICAgICAgIAogICAgICAgICAgICAgIGdlbmVfbGlzdCA9IGModG9wLnRhYmxlX09GX0RCICU+JSBmaWx0ZXIobG9nRkMgPiAwKSAlPiUgaGVhZCg1KSAlPiUgcm93Lm5hbWVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AudGFibGVfT0ZfREIgJT4lIGZpbHRlcihsb2dGQyA8IDApICU+JSBoZWFkKDUpICU+JSByb3cubmFtZXMoKSkpCmBgYAoKIyMgRGlmZiBUYWJsZQoKQWxsIGdlbmVzIHdpdGggYW4gRkRSIDwgMC4yLiBOb3QgdmVyeSBtYW55LiBUaGVyZSBhcmUgYSBsaW1pdGVkIG51bWJlciBvZiBzYW1wbGVzICpiZWZvcmUqIHRoZSBmdXNpb24gYmVnaW5zIChvbmx5ICpaRUJSQUZJU0gqIGluIGZhY3QhKSBjb21wYXJlZCB0byB0aGUgb3RoZXIgdGltZSBwb2ludHMuIAoKYGBge3J9CnRvcC50YWJsZV9PRl9EQiAlPiUgYXNfdGliYmxlKHJvd25hbWVzID0gJ0dlbmUnKSAlPiUgZmlsdGVyKGFkai5QLlZhbCA8IDAuMSkgJT4lICBEVDo6ZGF0YXRhYmxlKCkKYGBgCgojIyBFeHByZXNzaW9uIG9mIHRvcCA2IGdlbmVzIChGRFIpIGFjcm9zcyBzZWN0aW9uIGFuZCBzdGFnZQoKQ29sb3JlZCBieSBvcmdhbmlzbS4gRWFjaCBsaW5lIGlzIGRyYXduIGZvciBvcmdhbmlzbSAvIHRlY2hub2xvZ3kgKHJlbWVtYmVyLCBtb3VzZSBoYXMgYm90aCBtaWNyb2FycmF5IGFuZCBSTkEtc2VxKS4KCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KYm94X21hcmtlcihzdmFfY291bnRzLCAKICAgICAgICAgICBnZW5lcyA9IHRvcC50YWJsZV9PRl9EQiAlPiUgCiAgICAgICAgICAgICBhc190aWJibGUocm93bmFtZXMgPSAnR2VuZScpICU+JSAKICAgICAgICAgICAgIGZpbHRlcihhZGouUC5WYWwgPCAwLjA1KSAlPiUgaGVhZCg2KSAlPiUgcHVsbChHZW5lKSwKICAgICAgICAgICBzZWN0aW9uID0gJ09GJykKCmJveF9tYXJrZXIoc3ZhX2NvdW50cywgCiAgICAgICAgICAgZ2VuZXMgPSB0b3AudGFibGVfT0ZfREIgJT4lIAogICAgICAgICAgICAgYXNfdGliYmxlKHJvd25hbWVzID0gJ0dlbmUnKSAlPiUgCiAgICAgICAgICAgICBmaWx0ZXIoYWRqLlAuVmFsIDwgMC4wNSkgJT4lIGhlYWQoNikgJT4lIHB1bGwoR2VuZSksCiAgICAgICAgICAgc2VjdGlvbiA9ICdPQycpCmBgYAoKIyBFbnJpY2htZW50IEFuYWx5c2lzIChHTywgR1NFQSkgQmVmb3JlIC0+IER1cmluZwoKIyMgIEdTRUEKCkdTRUEgdXNlcyBhICpyYW5rZWQgbGlzdCogb2YgZ2VuZXMgYnkgbG9nRkMuIFNvIHRoZSBwIHZhbHVlcyBhcmUgbm90IHVzZWQgaW4gdGhpcyBzaXR1YXRpb24uIFRoZSAqb3JkZXIqIGlzLiBTbyB0aGUgR1NFQSBpcyB1c2VmdWwgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGVyZSBhcmUgdmVyeSBmZXcgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzLiBXZSBzZWUgaGVyZSB0aGUgc3VwcHJlc3NlZCAobmVnYXRpdmUgZXhwcmVzc2VkIGdlbmVzKSB0ZXJtcyBhcmUgcmVsYXRpbmcgdG8gbWl0b3NpcyAvIGNlbGwgZGl2aXNpb24uIFRoZSBhY3RpdmF0ZWQgZ2VuZSB0ZXJtcyBhcmUgcmVsYXRpbmcgdG8gbWVsYW5vY3l0ZXMvcGlnbWVudCBhbmQgaW9uIGNoYW5uZWxzLgoKIyMjIERvdHBsb3QKCmBgYHtyLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD02fQphbGxfZ2VuZXMgPC0gYml0cih0b3AudGFibGVfT0ZfREIgJT4lIGFzX3RpYmJsZShyb3duYW1lcyA9ICdHZW5lJykgJT4lIHB1bGwoR2VuZSksIGZyb21UeXBlPSJTWU1CT0wiLCB0b1R5cGU9IkVOVFJFWklEIiwgT3JnRGI9Im9yZy5Icy5lZy5kYiIpCmFsbF9nZW5lcyA8LSBhbGxfZ2VuZXMgJT4lIGxlZnRfam9pbih0b3AudGFibGVfT0ZfREIgJT4lIGFzX3RpYmJsZShyb3duYW1lcyA9ICdTWU1CT0wnKSwgYnkgPSBjKCdTWU1CT0wnKSkKCmxvZ0ZDIDwtIGFsbF9nZW5lcyRsb2dGQwpuYW1lcyhsb2dGQykgPC0gYWxsX2dlbmVzJEVOVFJFWklECmxvZ0ZDIDwtIG5hLm9taXQobG9nRkMpCgpsb2dGQyA9IHNvcnQobG9nRkMsIGRlY3JlYXNpbmcgPSBUUlVFKQoKZ3NlIDwtIGdzZUdPKGdlbmVMaXN0PWxvZ0ZDLAogICAgICAgICAgICAgb250ID0iQUxMIiwKICAgICAgICAgICAgIGtleVR5cGUgPSAiRU5UUkVaSUQiLAogICAgICAgICAgICAgcHZhbHVlQ3V0b2ZmID0gMC4wNSwKICAgICAgICAgICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLAogICAgICAgICAgICAgcEFkanVzdE1ldGhvZCA9ICJCSCIsCiAgICAgICAgICAgICBlcHMgPSAwKQpnc2UgPC0gc2V0UmVhZGFibGUoZ3NlLCBPcmdEYiA9IG9yZy5Icy5lZy5kYikKIyBjaGFuZ2Ugc29ydCBsb2dpYwpnc2VGIDwtIGdzZQpnc2VGQHJlc3VsdCA8LSByYmluZChnc2VGQHJlc3VsdCAlPiUgYXJyYW5nZShORVMpICU+JSBoZWFkKDIwKSwKICAgICAgICAgICAgICAgICAgICAgZ3NlRkByZXN1bHQgJT4lIGFycmFuZ2UoTkVTKSAlPiUgdGFpbCgyMCkgJT4lIGFycmFuZ2UoLU5FUykKKQpkb3RwbG90KGdzZUYsIHNob3dDYXRlZ29yeT0xNSwgc3BsaXQ9Ii5zaWduIikgKyBmYWNldF9ncmlkKC5+LnNpZ24pICsgY293cGxvdDo6dGhlbWVfY293cGxvdCgpCmBgYAoKIyMjIFRhYmxlCgpTbyB5b3UgY2FuIHNlZSB0aGUgZ2VuZXMgaW4gdGhlIG9udG9sb2d5IHRlcm0uIFRoZSBnZW5lcyBnZXQgImluY2x1ZGVkIiBhcyBlbnJpY2hlZCBpZiBHU0VBIGRlZW1zIHRoZW0gdG8gYmUgcmFua2VkIHVudXN1YWxseSBoaWdoLgpgYGB7cn0KZ3NlQHJlc3VsdCAlPiUgYXNfdGliYmxlKCkgJT4lIGFycmFuZ2UoLWFicyhORVMpKSAlPiUgZmlsdGVyKHAuYWRqdXN0IDwgMC4wNSkgJT4lICBEVDo6ZGF0YXRhYmxlKCkKYGBgCgojIyBHTyBFbnJpY2htZW50IAoKR08gZW5yaWNobWVudCB1c2VzIGEgKmN1dG9mZiogYmV0d2VlbiBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgKEZEUiA8IDAuMSBpbiB0aGlzIGNhc2UpIGFuZCBldmVyeXRoaW5nIGVsc2UuIAoKYGBge3IsIGZpZy53aWR0aD03fQpsaWJyYXJ5KGNsdXN0ZXJQcm9maWxlcikKbGlicmFyeShlbnJpY2hwbG90KQoKCmRpZmZfZ2VuZXMgPC0gdG9wLnRhYmxlX09GX0RCICU+JSBhc190aWJibGUocm93bmFtZXMgPSAnR2VuZScpICU+JSBmaWx0ZXIoYWRqLlAuVmFsIDwgMC4xKQplZ19kaWZmX2dlbmVzIDwtIGJpdHIoZGlmZl9nZW5lcyRHZW5lLCBmcm9tVHlwZT0iU1lNQk9MIiwgdG9UeXBlPSJFTlRSRVpJRCIsIE9yZ0RiPSJvcmcuSHMuZWcuZGIiKQplZ19kaWZmX2dlbmVzIDwtIGRpZmZfZ2VuZXMgJT4lIGxlZnRfam9pbiguLCBlZ19kaWZmX2dlbmVzLCBieSA9IGMoJ0dlbmUnID0gJ1NZTUJPTCcpKQplZ191bml2ZXJzZSA9IGJpdHIodG9wLnRhYmxlX09GX0RCICU+JSBhc190aWJibGUocm93bmFtZXMgPSAnR2VuZScpICU+JSBwdWxsKEdlbmUpLCBmcm9tVHlwZT0iU1lNQk9MIiwgdG9UeXBlPSJFTlRSRVpJRCIsIE9yZ0RiPSJvcmcuSHMuZWcuZGIiKQoKCmVnb09GX0RCIDwtIGVucmljaEdPKGdlbmUgICAgICAgICAgPSBlZ19kaWZmX2dlbmVzJEVOVFJFWklELAogICAgICAgICAgICAgICAgICAgICB1bml2ZXJzZSAgICAgID0gZWdfdW5pdmVyc2UkRU5UUkVaSUQsCiAgICAgICAgICAgICAgICAgICAgIE9yZ0RiICAgICAgICAgPSBvcmcuSHMuZWcuZGIsCiAgICAgICAgICAgICAgICAgICAgIG9udCAgICAgICAgICAgPSAiYWxsIiwKICAgICAgICAgICAgICAgICAgICAgcmVhZGFibGUgICAgICA9IFRSVUUpCgoKCnAxIDwtIGRvdHBsb3QoZWdvT0ZfREIsIHNob3dDYXRlZ29yeT0yMCkgKyBnZ3RpdGxlKCJEb3RwbG90IGZvciBHTywgT0YiKQpwMQoKCmBgYAojIyMgVGFibGUKClNvIHlvdSBjYW4gc2VlIHRoZSBnZW5lcyBpbiB0aGUgb250b2xvZ3kgdGVybS4KYGBge3J9CmVnb09GX0RCQHJlc3VsdCAlPiUgYXNfdGliYmxlKCkgJT4lICBmaWx0ZXIocC5hZGp1c3QgPCAwLjA1KSAlPiUgIERUOjpkYXRhdGFibGUoKQpgYGAKCiMjICJDTkVUIiBQbG90CgpSZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBHTyB0ZXJtcyB3aXRoIHNoYXJlZCBnZW5lcwpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NH0KZ2VuZUxpc3QgPC0gZWdfZGlmZl9nZW5lcyRsb2dGQwpuYW1lcyhnZW5lTGlzdCkgPC0gZWdfZGlmZl9nZW5lcyRHZW5lCmNuZXQgPC0gY25ldHBsb3QoZWdvT0ZfREIsIGZvbGRDaGFuZ2UgPSBnZW5lTGlzdCwgc2hvd0NhdGVnb3J5ID0gMTIpICsgc2NhbGVfY29sb3JfdmlyaWRpc19jKG5hbWUgPSAnbG9nMihGb2xkQ2hhbmdlKScpCmNuZXQKYGBgCgojIFdpa2lwYXRod2F5cwoKYGBge3J9CiMgc3lzdGVtKCJ3Z2V0IGh0dHBzOi8vd2lraXBhdGh3YXlzLWRhdGEud21jbG91ZC5vcmcvY3VycmVudC9nbXQvd2lraXBhdGh3YXlzLTIwMjExMTEwLWdtdC1Ib21vX3NhcGllbnMuZ210IikKd3AyZ2VuZSA8LSByZWFkLmdtdCgnd2lraXBhdGh3YXlzLTIwMjExMTEwLWdtdC1Ib21vX3NhcGllbnMuZ210JykKd3AyZ2VuZSA8LSB3cDJnZW5lICU+JSB0aWR5cjo6c2VwYXJhdGUodGVybSwgYygibmFtZSIsInZlcnNpb24iLCJ3cGlkIiwib3JnIiksICIlIikKd3BpZDJnZW5lIDwtIHdwMmdlbmUgJT4lIGRwbHlyOjpzZWxlY3Qod3BpZCwgZ2VuZSkgI1RFUk0yR0VORQp3cGlkMm5hbWUgPC0gd3AyZ2VuZSAlPiUgZHBseXI6OnNlbGVjdCh3cGlkLCBuYW1lKSAjVEVSTTJOQU1FCgpld3AgPC0gZW5yaWNoZXIoZWdfZGlmZl9nZW5lcyRFTlRSRVpJRCwKICAgICAgICAgICAgICAgIFRFUk0yR0VORSA9IHdwaWQyZ2VuZSwKICAgICAgICAgICAgICAgIFRFUk0yTkFNRSA9IHdwaWQybmFtZSwKICAgICAgICAgICAgICAgIHB2YWx1ZUN1dG9mZiA9IDAuMSkKCmV3cF9wbG90IDwtIGRvdHBsb3QoZXdwLCBzaG93Q2F0ZWdvcnk9MzApICsgZ2d0aXRsZSgiRG90cGxvdCBmb3IgV2lraVBhdGh3YXlzIikKZXdwX3Bsb3QKYGBgCiMjIFRhYmxlCmBgYHtyfQpld3AgPC0gc2V0UmVhZGFibGUoZXdwLCBPcmdEYiA9ICBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAnRU5UUkVaSUQnKQpld3BAcmVzdWx0ICU+JSBEVDo6ZGF0YXRhYmxlKCkKYGBgCgojIEtFR0cgUGF0aHdheSBFbnJpY2htZW50CgpgYGB7ciwgZmlnLndpZHRoPTN9CmtrIDwtIGVucmljaEtFR0coZ2VuZSAgICAgICAgID0gZWdfZGlmZl9nZW5lcyRFTlRSRVpJRCwgCiAgICAgICAgICAgICAgICAgdW5pdmVyc2UgPSBlZ191bml2ZXJzZSRFTlRSRVpJRCwKICAgICAgICAgICAgICAgICBvcmdhbmlzbSAgICAgPSAnaHNhJykKZG90cGxvdChraykgKyBnZ3RpdGxlKCJLRUdHIFBhdGh3YXkgRW5yaWNobWVudCIpIApgYGAKCiMjIFRhYmxlCmBgYHtyfQprayA8LSBzZXRSZWFkYWJsZShraywgT3JnRGIgPSAgb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gJ0VOVFJFWklEJykKa2tAcmVzdWx0ICU+JSBEVDo6ZGF0YXRhYmxlKCkKYGBgCgoKIyBNeSB0YWtlYXdheShzKQoKMS4gVGhlIGRpZmZlcmVudGlhbCB0ZXN0aW5nICpzZWVtcyogdG8gd29yayBhcyB0aGUgb3ZlcmFsbCBlbnJpY2hlZCBHU0VBIGZvdW5kIHRlcm1zIHJlbGF0ZSB0byBwcm9jZXNzZXMgdGhhdCBhcmUgaW52b2x2ZWQgaW4gY2VsbCBjeWNsZSwgYWRoZXNpb24sIGFuZCB0aGUgdmlzdWFsIGN5Y2xlLiAKMi4gRkdGMTggYW5kIExVTSBhcmUgaW50ZXJlc3RpbmcgKGFuZCBnbyBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zKQozLiBGR0YxOCBpcyBhIGdyb3d0aCBmYWN0b3IgYW5kIGhhcyBhIHJlY29tYmluYW50IGRydWcgKGh0dHBzOi8vd3d3Lm5hdHVyZS5jb20vYXJ0aWNsZXMvczQxNTk4LTAyMC02MzIxNi16KQo0LiBMVU0gaXMgaW50ZXJlc3RpbmcgaXQgaXMgYSBsZW5zIGFzc29jaWF0ZWQgZXh0cmFjZWxsdWxhciBtYXRyaXggcHJvdGVpbi4uLi5pcyBsZW5zIGRpZmZlcmVudGlhdGlvbiBnb2luZyBvbj8KCiMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0KZGV2dG9vbHM6OnNlc3Npb25faW5mbygpCmBgYAo=